<?php

class ResumenccController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //---------------------------------//
    //             PAGINAS             //
    //---------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Reporte.Resumen de Egresos')) return;

        try{
            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Reporte.Resumen de Egresos')) return;

        try{
            // obtener los parametros
            $editorRows    = $this->_request->getPost('editorRows');
            $fechaIni      = $this->_request->getPost('filtroInicial');
            $fechaFin      = $this->_request->getPost('filtroFinal');
            $departamento  = $this->_request->getPost('nombre');
            $total         = $this->_request->getPost('total');

            $rows = Zend_Json::decode($editorRows);

            // create PDF
            $pdf = new Zend_Pdf();
            // create A4 page
            $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE); //'842:595:'
            // define font resource
            $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
            $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

            $page->setFont($font2, 12)
                 ->drawText('Reporte :', 150, 560)
                 ->drawText('Centro de costos :', 150, 540)
                 ->drawText('Fecha inicial :', 150, 520)
                 ->drawText('Fecha final :', 150, 500);
            $page->setFont($font, 12)
                 ->drawText('Resumen de egresos de caja chica', 260, 560)
                 ->drawText("$departamento", 260, 540, 'UTF-8')
                 ->drawText("$fechaIni", 260, 520)
                 ->drawText("$fechaFin", 260, 500);

            $image = \Zend_Pdf_Image::imageWithPath('img/logoUCA.png');
            $page->drawImage($image, 20, 480, ($image->getPixelWidth()+20), (480+$image->getPixelHeight()));
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->drawLine(10, 465, ($page->getWidth()-10), 465);
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->drawLine(10, 445, ($page->getWidth()-10), 445);

            $page->setFont($font, 12)
                 ->drawText('Rubro', 20, 452)
                 ->drawText('Descripción', 120, 452,'UTF-8')
                 ->drawText('Comprobante', 275, 452)
                 ->drawText('Fecha', 365, 452)
                 ->drawText('Concepto', 435, 452)
                 ->drawText('Proveedor', 575, 452)
                 ->drawText('Monto', 755, 452);


            // add page to document
            $pdf->pages[] = $page;

            $pageNumber=1;
            $rubro='';

            //carga del detalle del log al pdf
            $i=430;
            foreach($rows as $row){

                //Verificar si es un nuevo rubro
                if(strcmp($rubro, $row['codigo'])!=0){
                    if(strcmp($rubro, '')!=0){
                        $montopos= 790-$this->getTextWidth($montorubro,$font2,10);
                        $page->setFont($font2, 10)
                             ->drawText(number_format($montorubro, 0,',','.'), $montopos, $i);
                             $i=$i-24;
                    }
                    $rubro = $row['codigo'];
                    $montopos = $i;
                    $montorubro = 0;

                  //  $row['nombreRubro'] = substr($row['nombreRubro'], 0, 23);

                    $page->setFont($font2, 9)
                         ->drawText($row['codigo'],       20, $i);
                    
                    $y=$i;
                    $text = wordwrap($row['nombreRubro'], 22);
                    $token = strtok($text, "\n'/'");
                    $salto = 0;
                    while ($token != false){
                    	$page->setFont($font, 10)->drawText($token,  120, $y, 'UTF-8');
                    	$token = strtok("\n'/'"); $y = $y-12;
                    	$salto++;
                    }
                    
                    if($salto>1){
                    	$i=$y+12*$salto;
                    }

                    $i=$i-12;
                }

                //si se aproxima el fin de pagina, nueva pagina
                if($i <= 90){
                    // create A4 page
                    $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE); //'842:595:'

                    // agregar pagina al pdf
                    $pdf->pages[] = $page;
                    $i=570;
                    $pageNumber++;
                }

                //si no es la primera pagina no utilizamos encabezado
                if($pageNumber>1 && $i==570){
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(10, 570, ($page->getWidth()-10), 570);
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(10, 550, ($page->getWidth()-10), 550);

                    $page->setFont($font, 12)
                        ->drawText('Rubro', 20, 555)
                        ->drawText('Descripción', 120, 555,'UTF-8')
                        ->drawText('Comprobante', 275, 555)
                        ->drawText('Fecha', 365, 555)
                        ->drawText('Concepto', 435, 555)
                        ->drawText('Proveedor', 575, 555)
                        ->drawText('Monto', 755, 555);

                    $i=535;
                }

             //   $row['concepto'] = substr($row['concepto'], 0, 22);
            //    $row['razonSocial'] = substr($row['razonSocial'], 0, 19);
                $montopos= 790-$this->getTextWidth($row['monto'],$font,10);

                $page->setFont($font, 10)
                    ->drawText($row['numeroComprobante'], 275, $i)
                    ->drawText($row['fechaMovimiento'],   365, $i)
                    ->drawText(number_format($row['monto'], 0,',','.'), $montopos, $i);
                
                $y1=$i;
                $text = wordwrap($row['razonSocial'], 21);
                $token = strtok($text, "\n");
                $salto1 = 0;
                while ($token != false){
                	$page->setFont($font, 10)->drawText($token,  575, $y1, 'UTF-8');
                	$token = strtok("\n"); $y1 = $y1-12;
                	$salto1++;
                }
                
                if($salto1>1){
                	$i=$y1+12*$salto1;
                }
                
                $y2=$i;
                $text = wordwrap($row['concepto'], 22);
                $token = strtok($text, "\n");
                $salto2 = 0;
                while ($token != false){
                	$page->setFont($font, 10)->drawText($token,  435, $y2, 'UTF-8');
                	$token = strtok("\n"); $y2 = $y2-12;
                	$salto2++;
                }
                
                if($salto1>$salto2){
                	$i=$y1+12;
                }
                else{
                	$i=$y2+12;
                }
                
                $montorubro = $montorubro + $row['monto'];

                $i =$i - 24;
            }
            $montopos= 790-$this->getTextWidth($montorubro,$font2,10);
            $page->setFont($font2, 10)
                 ->drawText(number_format($montorubro, 0,',','.'), $montopos, $i);

            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->setLineDashingPattern(0, 0)
                 ->drawLine(700, $i-4, 800, $i-4);
            $total = intval($total);
            $montopos= 790-$this->getTextWidth($total,$font2,10);
            $page->setFont($font2, 10)
                 ->drawText(number_format($total, 0,',','.'), $montopos, $i-17);

            // Agregar numero de pagina al pie
            $pageNumber=1;
            foreach($pdf->pages as $p){
                $p->drawText($pageNumber++,  790, 40);
            }

            // Guardar el pdf
            $fileName = 'ResumenEgresosCC.pdf';
            $pdf->save($fileName);

            X\Msg::Success('El reporte se ha generado con éxito.');

        }
        catch(Exception $e){
            X\Msg::Failure('Error al generar el reporte.');
        }
    }

    public function pdfAction(){

          $pdf = Zend_Pdf::load('ResumenEgresosCC.pdf');

          $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
          $this->getResponse()->setHeader('Content-disposition', "filename=ResumenEgresosCC.pdf", true);
          $this->getResponse()->setBody($pdf->render());
     }

    public function ajaxFiltroAction()
    {
        if (X\CheckAccess::AjaxAction($this,'Reporte.Resumen de Egresos')) return;

        try{
            // obtener los parametros
            $filtroDepartamento = $this->_request->getPost("filtroDepartamento");
            $filtroInicial      = $this->_request->getPost("filtroInicial");
            $filtroFinal        = $this->_request->getPost("filtroFinal");

            // fijar cota de fechas y horas para el retrieve de datos
            $filtroInicial  = str_replace(        'T',         ' ', $filtroInicial);
            $filtroFinal    = str_replace('T00:00:00', ' 23:59:59', $filtroFinal  );

            // crear el where para filtrar
            $filtroFecha = ($filtroInicial && $filtroFinal? "m.fechaMovimiento >= '$filtroInicial' and m.fechaMovimiento <= '$filtroFinal'"
                         : ($filtroInicial                ? "m.fechaMovimiento >= '$filtroInicial'"
                         : ($filtroFinal                  ? "m.fechaMovimiento <= '$filtroFinal'"
                         : '')));
            $filtroDepartamento =  "d.codigoDepartamento = '$filtroDepartamento'";

            // obtener los datos
            $movimientos = $this->em->createQueryBuilder()
                ->select    ('m.codigoMovimiento')
                ->addselect ('m.concepto')
                ->addselect ('m.monto')
                ->addselect ('c.codigoComprobante')
                ->addselect ('c.numeroComprobante')
                ->addselect ('o.razonSocial')
                ->addselect ('m.fechaMovimiento')
                ->addselect ('r.codigo')
                ->addselect ('r.egreso')
                ->addselect ('r.nombreRubro')
                ->from      ('Default_Model_Movimiento', 'm')
                ->leftjoin  ('m.cuenta',                 'cu')
                ->leftjoin  ('m.comprobante',            'c')
                ->leftjoin  ('c.usuario',                'u')
                ->leftjoin  ('u.departamento',           'd')
                ->leftjoin  ('c.organizacionesExternas', 'o')
                ->leftjoin  ('cu.rubro',                 'r')
                ->where     ($filtroFecha)
                ->andWhere  ($filtroDepartamento)
                ->andWhere  ('r.egreso = true')
                ->andWhere  ('m.tipoMovimiento = 3')
                ->orderBy   ('r.codigo', 'asc')
                ->getQuery  ()
                ->execute   ();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($movimientos),
                "rows"    => $movimientos
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los datos.'.$e->getMessage());
        }
    }

    public function getTextWidth($text, Zend_Pdf_Resource_Font $font, $font_size)
    {
	$drawing_text = iconv('', 'UTF-16BE', $text);
	$characters    = array();
	for ($i = 0; $i < strlen($drawing_text); $i++) {
		$characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]);
	}
	$glyphs        = $font->glyphNumbersForCharacters($characters);
	$widths        = $font->widthsForGlyphs($glyphs);
	$text_width   = (array_sum($widths) / $font->getUnitsPerEm()) * $font_size;
	return $text_width;
    }
}
